# -*- coding: utf-8 -*-
"""
Created on Thu Mar 24 21:23:50 2022

@author: Calci
"""

import cv2
import numpy as np  # 导入库
import serial

flag = 0
ser = serial.Serial("/dev/ttyAMA0", 9600)
color_Lower = np.array([15, 25, 60])
color_Upper = np.array([25, 35, 85])  # 设置颜色区间
# brown  (15,25,60)->(25,35,85)
# red    (15,5,125)->(35,35,185)
# purple (75,25,85)->(120,70,120)


cap_Color = cv2.VideoCapture(0)  # 打开摄像头
cap_Color.set(3, 640)
cap_Color.set(4, 480)  # 设置窗口的大小
while 1:
    _, frame_Color = cap_Color.read()  # 将摄像头拍摄到的画面作为frame的值
    frame_Color = cv2.GaussianBlur(
        frame_Color, (5, 5), 0)  # 高斯滤波GaussianBlur() 让图片模糊
    mask_Color = cv2.inRange(frame_Color, color_Lower,
                             color_Upper)  # 设置阈值，去除背景 保留所设置的颜色

    mask_Color = cv2.erode(mask_Color, None, iterations=2)  # 显示腐蚀后的图像
    mask_Color = cv2.GaussianBlur(mask_Color, (3, 3), 0)  # 高斯模糊
    res_Color = cv2.bitwise_and(
        frame_Color, frame_Color, mask=mask_Color)  # 图像合并

    cnts_Color = cv2.findContours(mask_Color.copy(), cv2.RETR_EXTERNAL,
                                  cv2.CHAIN_APPROX_SIMPLE)[-2]  # 边缘检测

    if len(cnts_Color) > 0:  # 通过边缘检测来确定所识别物体的位置信息得到相对坐标
        cnt = max(cnts_Color, key=cv2.contourArea)
        (x, y), radius = cv2.minEnclosingCircle(cnt)
        cv2.circle(frame_Color, (int(x), int(y)), int(
            radius), (255, 0, 255), 2)  # 画出一个圆
        # print(int(x),int(y))
        print('b')
        flag = 1
        p = 'b'
        ser.write(p.encode())

    else:
        pass
    ser.flushInput()
    cv2.imshow('frame', frame_Color)  # 将具体的测试效果显示出来
    cv2.imshow('mask', mask_Color)
    cv2.imshow('res', res_Color)
    if cv2.waitKey(5) & 0xFF == 27:  # 如果按了ESC就退出 当然也可以自己设置
        break

cap_Color.release()
cv2.destroyAllWindows()  # 后面两句是常规操作,每次使用摄像头都需要这样设置一波
